package com.ljx.bridgeMode;

/**
 * 桥接模式
 * 定义：
 * 将抽象与实现分离，使它们可以独立变化。它是用组合关系代替继承关系来实现，从而降低了抽象和实现这两个可变维度的耦合度
 *
 * 好处：
 * 桥接模式提高了系统的可扩充性，在两个变化维度中任意扩展一个维度，都不需要修改原有系统。
 * 如：如果现在还有一种视频文件类型wmv，我们只需要再定义一个类实现VideoFile接口即可，其他类不需要发生变化。
 * 实现细节对客户透明
 *
 * 使用场景：
 * 当一个类存在两个独立变化的维度，且这两个维度都需要进行扩展时。
 * 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
 * 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系，通过桥接模式可以使它们在抽象层建立一个关联关系。
 *
 * @作者 LJX
 * @日期 2022/12/23 10:41
 */
public class BridgeTest {

    public static void main(String[] args) {
        OperatingSystem mac = new Mac(new MP4Video());
        mac.playVideo("了不起的盖茨比");

        OperatingSystem win = new Win(new RMVBVideo());
        win.playVideo("华尔街之狼");
    }

}

/**
 * 视频类型接口（实现化角色）
 */
interface VideoFile{
    /**
     * 解码方法
     * @param fileName
     */
    void encode(String fileName);

}

/**
 * MP4格式（具体实现化角色）
 */
class MP4Video implements VideoFile{

    @Override
    public void encode(String fileName) {
        System.out.println("MP4文件：" + fileName);
    }
}

/**
 * RMVB格式（具体实现化角色）
 */
class RMVBVideo implements VideoFile{

    @Override
    public void encode(String fileName) {
        System.out.println("RMVB文件：" + fileName);
    }
}

/**
 * 抽象操作系统（抽象化角色）
 */
abstract class OperatingSystem{

    protected VideoFile videoFile;

    public OperatingSystem(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    /**
     * 播放视频抽象方法
     */
    public abstract void playVideo(String fileName);
}

/**
 * MAC操作系统（扩展抽象化角色）
 */
class Mac extends OperatingSystem{

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void playVideo(String fileName) {
        System.out.println("Mac系统播放：" + fileName);
        videoFile.encode(fileName);
    }
}

/**
 * WIN操作系统（扩展抽象化角色）
 */
class Win extends OperatingSystem{

    public Win(VideoFile videoFile) {
        super(videoFile);
    }

    @Override
    public void playVideo(String fileName) {
        System.out.println("Win系统播放：" + fileName);
        videoFile.encode(fileName);
    }
}
